#include <iostream>
using namespace std;

class Data{
public:
    Data(){
        cout<<"Data"<<endl;
    }
    void display(){
        cout<<"10"<<endl;
    }
private:
    int _data=10;
};

class middlelayer{
public:
    middlelayer(Data* data)
        :_ml(data)
    {
        cout<<"middlelayer"<<endl;
    }
    //想把对象当成指针来使用，
    Data * operator->(){
        return _ml;
    }
    //可以解引用这个对象，得到的也会是指针解引用
    Data & operator*(){
        return *_ml;
    }
    void display(){
        cout<<"middlelayer::display"<<endl;
    }
private:
    Data* _ml;
};
void test(void){
    middlelayer ml(new Data());
    ml.display();
    //先调用operator->()函数得到一个Data类型的指针
    //然后因为是对象的指针，可以直接用->去调用类
    //成员函数
    ml.operator->()->display();
    //也是先调用operator*()函数得到的Data类型指针
    //解引用后的结果，这个结果就是一个Data对象引用i
    //可以直接用.运算符去直接掉哦那个类成员函数
    ml.operator*().display();
    //先调用了operator->函数，然后再解引用，此时
    //得到的就是一个Data对象了，就可以直接调用
   (* ml.operator->()).display();
   //此时的ml对象不是普通的对象，而是重载了operator*
   //的特殊对象，此时直接*会调用operator*函数，返回
   //一个Data对象的引用，此时再去调用就会得到10；
   (*ml).display();
}
int main(){
    test();
    return 0;
}


